#ifndef MQTTWIDGET_H
#define MQTTWIDGET_H

#include <QFrame>
#include <QPainter>
#include <QGridLayout>
#include "QtQmqtt"
#include "addmqttdialog.h"

//#define Offset_Addr 65486
//struct baseConfig
//{
//    int boardType = 0;              //开发板类型 0：采集表 1：温湿度采集 2：开关控制端 3：开关被控端 4：综合端
//    uint baud = 115200;             //串口波特率
//    int  model = 0;                 //调试模式标志位
//    char wifiName[100] = {'0'};     //wifi名
//    char wifiPWD[50] = {'0'};       //wifi密码
//    char serverIp[20] = {'0'};      //服务器IP地址
//    uint serverPart = 0;            //服务器端口号
//    char serverName[100] = {'0'};   //服务程序登录名
//    char serverPWD[50] = {'0'};     //服务程序密码
//};


//struct DHTConfig : baseConfig
//{
//    int timeSpace = 1000;    //检测上传时间间隔，如果<0，表示订阅，单位ms
//    uchar QOS = 0;            //信息质量
//    char tempName[50] = {'0'};
//    char humName[50] = {'0'};
//};

//struct OnOffConfig : baseConfig
//{
//    int timeSpace = 0;    //>=0表示发送端（控制端），如果<0表示订阅（接收端）
//    uchar QOS = 0;            //信息质量
//    char onOffname[50] = {'0'};
//};


//文本、开关量、开关控制、模拟量、模拟量设置
//此处需要继承QFrame，而不是QWidget，因为QFrame 的自带paintEvent函数已做了实现，在使用样式表时会进行解析和绘制
//在继承QWidget时，我们在设置样式表时，不会有效果。原因在于 QWidget的paintEvent函数实现为空。
//该基类的主要功能是各种控件的底层，实现拖动和修改大小，释放自身等
class MqttWidget : public QFrame
{
    Q_OBJECT
public:
    explicit MqttWidget(QWidget *parent = nullptr);
    ~MqttWidget();  //是否需要设置为虚函数，考虑内存泄漏问题
    virtual void getMessage(QMQTT::Message mesage) = 0;//接收到mqtt消息，设置为虚函数给各个不同的子类自己处理
    void setData(MqttData data);
    MqttData getData();

signals:
    void deleteThis(int id);
    void sendMessage(QMQTT::Message mesage);    //发送mqtt消息信号,各个子类调用

protected:
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent*) override;
    void focusInEvent(QFocusEvent *e) override;
    void focusOutEvent(QFocusEvent *e) override;

private:
    void showMenu(const QPoint &pos);

protected:
    QGridLayout *gridLayout;

    QPoint globalPos;
    QSize basicSize;
    bool pressed = false;   //按下标志位
    bool canMove = false;   //可移动标志位
    uchar moveType = 0;     //移动类型
    bool isFocus = false;   //聚焦标志位
    bool canEdit;           //可编辑标志位
public:
    int id;
    MqttData mData;

};




#endif // MQTTWIDGET_H
